203. 移除链表元素
203. 移除链表元素
分析
如果要移除的节点是头节点,其操作跟要移除的节点是非头节点的时候不一样,很容易就想到,我们可以加一个虚拟头节点,然后统一移除操作。最后返回的时候,只返回虚拟节点的下一个节点即可,代码写出来非常优雅。
此外我们要注意,要移除一个节点,得确定这个节点的前一个节点。只有确定了待删除节点的前一个节点,我们才可以通过跳过这个节点的子节点的方式删除目标节点。因此,思路就出来了。
这里还有一个需要注意的地方,就是,如果下一个节点就是要删除的节点假设是 A1,删除之后,新的下一个节点是 A2,此时,我们还得继续检查 A2,因为 A2 可能也是要删除的节点。也就是说此时不要移动当前指针指向的节点。而如果下一个节点不是,那么就可以移动当前指针指向的节点。
解题
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode nowNode = dummyHead;
while (nowNode != null && nowNode.next != null) {
ListNode nextNode = nowNode.next;
if (nextNode.val == val) {
// 删除节点 nextNode,但是不更新 nowNode
nowNode.next = nextNode.next;
}else{
nowNode = nowNode.next;
}
}
return dummyHead.next;
}